import axios from 'axios';
const CancelToken = axios.CancelToken;
axios.defaults.timeout = 180000000;
// axios.defaults.timeout = 30000;
axios.defaults.retry = 4;
axios.defaults.retryDelay = 1000;

window._axiosPromiseArr = [];

axios.interceptors.request.use(config => {
    config.cancelToken = new axios.CancelToken(cancel => {
        window._axiosPromiseArr.push({ cancel });
    });
    return config;
}, err => {
    console.log(err);
    return Promise.reject(err);
});
axios.interceptors.response.use(undefined, function axiosRetryInterceptor (err) {
    let config = err.config;
    // If config does not exist or the retry option is not set, reject
    if (!config || !config.retry) return Promise.reject(err);

    // Set the variable for keeping track of the retry count
    config.__retryCount = config.__retryCount || 0;

    // Check if we've maxed out the total number of retries
    if (config.__retryCount >= config.retry) {
        // Reject with the error
        return Promise.reject(err);
    }

    // Increase the retry count
    config.__retryCount += 1;

    // Create new promise to handle exponential backoff
    let backoff = new Promise(function (resolve) {
        setTimeout(function () {
            resolve();
        }, config.retryDelay || 1);
    });

    // Return the promise in which recalls axios to retry the request
    return backoff.then(function () {
        return axios(config);
    });
});

export default axios;